<?php
namespace Monkey\Database;

use MonkeyException;
use Monkey\Database\Driver as DBDriver;

/**
 * 连接管理器\Monkey\Database\LinkManager
 * @package    Monkey\Database
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\Database\LinkManager.php 版本号 2013-03-30 $
 */
final class LinkManager
{
    private static $_instance;
    private $_links;    //连接池
    private $_links_file='/config/database.ini.php';    //连接池文件
    private function __construct(){
        if(file_exists(SYSTEM.$this->_links_file)){
            $this->_links=include(SYSTEM.$this->_links_file);
        }
    }
    /**
     * 获取连接管理器的单例
     * 单例已经连接了连接池中的默认连接
     * @return \Monkey\Database\LinkManager
     */
    public static function _instance(){
        !self::$_instance and self::$_instance=new self();
        return self::$_instance;
    }
    /**
     * 保存整个连接池参数
     * @param string|mixed $project 项目目录
     * @return $this
     */
    public function save($project=SYSTEM){
        fileSaveVariable($project.$this->_links_file, $this->_links);
        return $this;
    }
    /**
     * 更新连接池
     * @param string|int $key 连接名；
     * @param array $config 连接参数（一维数组）
     * @return \Monkey\Database\LinkManager
     */
    public function putLink($key,array $config){
        $this->_links[$key]=$config;
        return $this;
    }
    /**
     * 删除一个连接
     * @param string|int $key 连接名；
     * @return \Monkey\Database\LinkManager
     */
    public function deleteLink($key){
        if(!empty($this->_links) && !is_null($key) && isset($this->_links[$key])){
            unset($this->_links[$key]);
        }
        return $this;
    }
    /**
     * 清除整个连接池
     * @return \Monkey\Database\LinkManager
     */
    public function clearLink(){
        $this->_links=array();
        return $this;
    }
    /**
     * 获取连接参数
     * @param string|int $key 连接名；
     * @return array 成功后返回设置的连接参数。失败将抛出异常
     */
    public function getLink($key){
        if(empty($this->_links) || is_null($key) || !isset($this->_links[$key])){
            MonkeyException::halt('指定的数据库连接不存在！',2048,__FILE__,__LINE__);
        }
        return $this->_links[$key];
    }
    /**
     * 获取连接池中的第一条连接
     * @return array 成功后返回设置的连接参数。失败将抛出异常
     */
    public function getLinkOfFirst(){
        if(empty($this->_links))MonkeyException::halt('数据库连接不存在！',2048,__FILE__,__LINE__);
        reset($this->_links);
        return current($this->_links);
    }
    public function getAllLinks(){
        return $this->_links;
    }
    /**
     * 判断连接是否存在
     * @param string|integer $key 连接池的键名
     * @return bool
     */
    public function existKey($key){
        if(empty($this->_links)) return false;
        return !is_null($key) && isset($this->_links[$key]);
    }
    /**
     * 测试一条连接
     * @param string|int|array $arg
     * 1：字符串或数字，测试连接池中对应键名连接；
     * 2：数组，直接当成连接参数。
     * @return array 通用通知包
     */
    public function testLink($arg){
        if(!is_array($arg)){
            $arg=$this->getLink($arg);
        }
        $tester=new $arg['type']($arg,true);
        $notice=$tester->connect($arg,true);
        unset($tester);
        return $notice;
    }
    /**
     * @param null|string|int $key 连接键名
     * @return \Monkey\Database\Driver\_Interface
     */
    public function &getDriver($key){
        $link=$this->getLink($key);
        $type='Monkey\\Database\\Driver\\'.$link['type'];
        return new $type($link);
    }
}